package com.neusoft.thread6pool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 创建一个可重用固定线程集合的线程池，以共享的无界队列方式来运行这些线程。
 * @author Zhang.Yan
 *
 */
public class ThreadPoolTest 
{

	public static void main(String[] args) 
	{
		ExecutorService execServ=null;
		/*
		 * 创建了一个固定大小的线程池，容量为3，然后循环执行了4个任务，由结果可以看到，前3个任务首先执行完，然后空闲下来的线程去执行第4个任务，
	     * 在FixedThreadPool中，有一个固定大小的池，如果当前待执行的任务超过了池大小，那么多余的任务等待状态，直到有空闲的线程来执行任务，
	     * 而当执行的任务小于池大小，空闲的线程也不会去销毁。
		 */
//		execServ=Executors.newFixedThreadPool(3);
		/*
		 * CachedThreadPool会创建一个缓存区，将初始化的线程缓存起来，若有可用线程，就使用创建好的线程，若无则创建新线程，
		 * 60秒未被使用的线程会被终止并且从缓存中移除
		 */
//		execServ=Executors.newCachedThreadPool();
		/*
		 *  4个任务是顺序执行的，SingleThreadExecutor得到的是一个单个的线程，这个线程会保证任务执行完成，如果当前线程意外终止，会创建一个新线程继续执行任务，
		 *  这和我们直接创建线程不同，也和newFixedThreadPool(1)不同。
		 */
		execServ=Executors.newSingleThreadExecutor();
		for(int i=1;i<5;i++)
		{
			final int taskID=i;
			execServ.execute(new Runnable() {
				
				@Override
				public void run() {
					for(int i = 1; i < 5; i++) 
					{  
                        try 
                        {  
                        	// 为了测试出效果，让每次任务执行都需要一定时间  
                            Thread.sleep(20);
                        } 
                        catch (InterruptedException e) 
                        {  
                            e.printStackTrace();  
                        }  
                        System.out.println("第" + taskID + "次任务的第" + i + "次执行");  
                    }  
				}
			});
		}
		execServ.shutdown();
	}

}
